User's Guide
============
 Appendix A, "The Optimizer"
 ---------------------------
  Page 181
  --------
   The -Os entry in Table A.1 should indicate that it is the default
   value for the command-line and IDE compilers.

   Also, the sentence

    "In particular, -G and -G- are -Os and -Ot, respectively."

   should read

    "In particular, -G and -G- are -Ot and -Os, respectively."

  Page 190
  --------
   Add the following paragraph to the Object Data section, right
   before the section titled "The _fastcall modifier"

    You must compile all descendants and ancestors of a class with
    Object Data if you want that hierarchy to use Object Data. For
    example, if you use a class library that hasn't been compiled
    using Object Data (like Turbo Vision or ObjectWindows), your
    applications can still use Object Data even though those classes
    don't. The compiler knows (from pragmas in the header files)
    that those classes weren't compiled with Object Data and won't
    try to force descendants of them to use Object Data. Classes you
    define entirely within your application, on the other hand, will
    use Object Data.


Programmer's Guide
==================
 Chapter 3, "C++ specifics"
 --------------------------
  Page 127
  --------
   The sample function main should be as follows:

   int main()
   {
     X one(10);   // invokes X::X(int) and sets integer_part to 10
     X two(3.14); // invokes X::X(double) and sets double_part to 3.14
   }

 Chapter 4, "The preprocessor"
 -----------------------------
  Page 171+
  --------
   There are two additional pragmas:

    #pragma codestring "string"
     The specified string is emitted into the code segment;
     note that no terminating null is emitted. This #pragma
     is useful for embedding strings like copyright notices,
     module signatures, etc. in the code segment.

    #pragma codeseg [seg-name [group-name] ["class-name"]]

     Specifies the code segment name (and optionally group
     and/or class name) that function bodies following
     this pragma will be emitted into. When no parameters
     are given, the code segment is switched back to the
     initial code segment.

  Page 175+
  ---------
   The predefined version macros have been updated:
    __BORLANDC__    is now defined as 0x0410
    __TURBOC__      is now defined as 0x0410
    __BCPLUSPLUS__  is now defined as 0x0310
    __TCPLUSPLUS__  is now defined as 0x0310

 Chapter 5, "Using C++ streams"
 ------------------------------
  Page 204
  --------
   The first parameter to the constructors for the class istrstream
   is incorrectly specified as a const char *; it actually is a char *.

  Page 207
  --------
   The last sentence in the introductory paragraph to streambuf
   should read:

   streambuf is a base for conbuf, filebuf, and strstreambuf.

 Chapter 6, "The container class libraries"
 ------------------------------------------
  Page 264
  --------
   The description of ContainerIterator::operator ++ should read:

   Advances the iterator one position in the container. The first
   version returns the object referred to <after> incrementing;
   the second version returns the object referred to <before>
   incrementing. The int argument is used to distinguish between
   the prefix and postfix increment operators. (See "Overloading
   unary operators" on page 138 for details.)

 Chapter 8, "Building a Windows application"
 -------------------------------------------
  Page 321
  --------
  The TLINK command line should be changed to:

   tlink /Tw /v /n /c C:\BORLANDC\LIB\c0ws whello,\
         whello,\
         ,\
         C:\BORLANDC\LIB\cws
                         ^^^



Tools and Utilities Guide
=========================
 Introduction
 ------------
  Transfer macros, the Turbo Editor Macro Language (TEML), and
  the Turbo Editor Macro Compiler (TEMC) are also documented in
  the online file UTIL.DOC.

 Chapter 1, "Import library tools"
 ---------------------------------
  Page 7
  ------
   IMPLIBW does allow you to create a single import library from
   multiple DLLs or module definition files. At the File Select
   dialog box, you can type multiple filenames in the File edit
   control. When you choose OK to make the import library,
   IMPLIBW will use all the exports from each of the DLLs or
   module definition files you listed. Note that you can only
   select a single file using the file list box; you must type in
   the filenames if you need to specify more than one.

 Chapter 2, "Make: The program manager"
 --------------------------------------
  Page 11
  -------
   In the sentence that begins "All options that do not specify a
   string (-s or ρa, for example)..." the "ρa" should be "-a".

  Page 33
  -------
   The last word of the page, "which" should be "while $<".

 Chapter 3, "TLIB: The Turbo librarian"
 --------------------------------------
   There is an additional TLIB command line option, /0, which is not
   documented in the printed TLIB reference (Chapter 3 of the Tools &
   Utilities Guide).  The /0 option instructs the Turbo Librarian to
   remove all "Comment" records from the library.  Comment records are
   typically used to store information used by the debugger or other
   tools, and are not needed to create an executable file.  Using this
   option will make your libraries (and executable programs created using
   the libraries) smaller.  The /0 option is equivalent to checking
   Purge Comment Records in the Options|Librarian dialog box within the IDE.

 Chapter 4, "TLINK: The Turbo linker"
 --------------------------------------
  Page 58
  -------
   Change the TLINK format description to:

    tlink C0[W|D|F]x myobjs,exe,[map],[IMPORT][mylibs][OVERLAY]
    [EMU|FP87 mathx][CWx|Cx],[deffile]
    ^^^^^^^^^^^^^^^^^^^^^^^^
  Page 60
  -------
   Reverse the order of the two bullet items below:

   o CWx.LIB, the run-time library..
   o if you are using floating point math, FP87.LIB...

   The math libraries should be linked before the run-time library.

 Chapter 5, "Using WinSight"
 ---------------------------
  The paragraph "Formatting message parameters" should be replaced
  with the following two paragraphs:

   Normally, the Message Trace pane interprets each message's 
   parameters and return value and displays them in a more 
   easily human readable format. You can disable this by 
   unchecking "Interpret Values" in the Message Trace Options
   dialog box.

   The Message Trace pane usually displays information about 
   the parameters and return value of a message in decimal.
   Since it's sometimes more convenient to view a message's
   detail in hexadecimal, you can enable hex-only interpretation
   by checking "Hex Values" in the Message Trace Options
   dialog box.

 Appendix A, "Error messages"
 ----------------------------
  Page 177
  --------
   MAKE and MAKER generate a new error message:
    Cycle in include files: 'filename.h'
    You can't recursively include files.

  Page 182
  --------
   In the TLINK warning "filename(linenum): Duplicate internal name
   in imports," there is an extraneous right bracket that should be
   removed.

  Page 192
  --------
   There is a new compiler warning:

    Initialization is only partially bracketed
     When structures are initialized, braces can be used to mark the 
     initialization of each member of the structure. If a member 
     itself is an array or structure, nested pairs of braces may be 
     used. This ensures that your idea and the compiler's idea of what 
     value goes with which member are the same. When some of the 
     optional braces are omitted, the compiler issues this warning.

  Page 197
  --------
   In the compile-time error "Last parameter of operator must have
   type int," "operator-ρ" should actually read "operator--"

   The TLIB warning "library contains COMDEF records - extended
   dictionary not created," should have the following note:
     Any C++ module that contains virtual functions will have
     COMDEF records; therefore, you can't create an extended
     dictionary for C++ modules.

  Page 198
  --------
   The compile-time error "main must have return type of int"
   actually applies to ANSI C (-A on the command line), not C++.

  Page 235
  --------
   There is a new linker error message:

    "Unable to process debug: disable TASM /zi option".

    The linker cannot process information generated in .ASM files
    by the compiler (using the /S or /B option from the command
    line or the IDE  Options|Compiler|Code Generation|
    Generate Assembler Source or Compile Via Assembler.



Library Reference
=================
  Chapter 2, "The run-time library"
  ---------------------------------
    Page 173
    --------
      Under "Return value" "doserno" should be "_doserrno".

    Page 174
    --------
      Under "Return value" "doserno" should be "_doserrno" and
      the entry for ENOENT should be "Path or file name not found".

    Page 185
    --------
      _fpreset is actually not available under Windows

    Page 551
    --------
      strxfrm's "Return value" should read: "The length of s1."

  Note that two functions are incorrectly prototyped in the Library
  Reference. Here are their correct prototypes:

   size_t far _fstrlen(const char far *s);
   size_t far _fstrcspn(const char far *s1, const char far *s2);

  The following functions have some missing documentation in the
  Library Reference:

  ------------------------------------------------------------------
  Function: stackavail
  Gets the amount of available memory.

  Syntax:
  #include <malloc.h>
  size_t stackavail(void);

  ΙΝΝΝΝΝΝΝΡΝΝΝΝΝΝΝΝΡΝΝΝΝΝΝΝΝΝΝΡΝΝΝΝΝΝΝΝΝΝΡΝΝΝΝΝΝΝΝΝΝΝ»
  Ί  DOS  ³  UNIX  ³  Windows ³  ANSI C  ³ C++ only  Ί
  ΗΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΔΔΔΆ
  Ί    ώ  ³        ³          ³          ³           Ί
  ΘΝΝΝΝΝΝΝΟΝΝΝΝΝΝΝΝΟΝΝΝΝΝΝΝΝΝΝΟΝΝΝΝΝΝΝΝΝΝΟΝΝΝΝΝΝΝΝΝΝΝΌ

  Remarks:
  stackavail returns the number of bytes available on the stack. This
  is the amount of dynamic memory which alloca may access.

  Return value:
  stackavail returns a size_t value indicating the number of bytes
  available.

  See also:
  alloca, allocmem, coreleft, _dos_allocmem, farcoreleft,
  _stklen (global variable)

  Example:
  #include <malloc.h>
  #include <stdio.h>

  int main(void) {
     char *buf;

     printf("\nThe stack: %u\tstack pointer: %u", stackavail(), _SP);
     buf = (char *) alloca(100 * sizeof(char));
     printf("\nNow, the stack: %u\tstack pointer: %u", stackavail(), _SP);
     return(0);
     }


  Program output:
    The stack: 63528         stack pointer: 65524
    Now, the stack: 63424    stack pointer: 65420


  ------------------------------------------------------------------
  Function: strcmp, _fstrcmp
  Compares one string to another.

  Syntax:
  #include <string.h>
  Near version: int strcmp(const char *s1, const char *s2);
  Far version: int far _fstrcmp(const char far *s1, const char far *s2);


                ΙΝΝΝΝΝΝΝΡΝΝΝΝΝΝΝΝΡΝΝΝΝΝΝΝΝΝΝΡΝΝΝΝΝΝΝΝΝΝΡΝΝΝΝΝΝΝΝΝΝΝ»
                Ί  DOS  ³  UNIX  ³  Windows ³  ANSI C  ³ C++ only  Ί
                ΗΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΔΔΔΆ
  Near version  Ί    ώ  ³    ώ   ³     ώ    ³    ώ     ³           Ί
                ΗΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΔΔΔΆ
  Far version   Ί    ώ  ³        ³     ώ    ³          ³           Ί
                ΘΝΝΝΝΝΝΝΟΝΝΝΝΝΝΝΝΟΝΝΝΝΝΝΝΝΝΝΟΝΝΝΝΝΝΝΝΝΝΟΝΝΝΝΝΝΝΝΝΝΝΌ

  Remarks:
  strcmp performs an unsigned comparison of s1 to s2, starting with
  the  first character in each string and continuing with
  subsequent characters  until the corresponding characters differ
  or until the end of the strings is reached.

  Return value:
  strcmp returns a value that is

    < 0 if s1 is less than s2
    == 0 if s1 is the same as s2
    > 0 if s1 is greater than s2

  See also:
  strcmpi, strcoll, stricmp, strncmp, strncmpi, strnicmp

  Example:
  #include <string.h>
  #include <stdio.h>

  int main(void)
  {
     char *buf1 = "aaa", *buf2 = "bbb", *buf3 ="ccc";
     int ptr;
     ptr = strcmp(buf2, buf1);
     if (ptr > 0)
        printf("buffer 2 is greater than buffer 1\n");
     else
        printf("buffer 2 is less than buffer 1\n");
     ptr = strcmp(buf2, buf3);
     if (ptr > 0)
        printf("buffer 2 is greater than buffer 3\n");
     else
        printf("buffer 2 is less than buffer 3\n");
     return 0;
  }



  ------------------------------------------------------------------
  Function: strcpy, _fstrcpy
  Copies one string into another.

  Syntax
  #include <string.h>
  Near version: char *strcpy(char *dest, const char *src);
  Far version: char far * _fstrcpy(char far *dest, const char far *src);



                ΙΝΝΝΝΝΝΝΡΝΝΝΝΝΝΝΝΡΝΝΝΝΝΝΝΝΝΝΡΝΝΝΝΝΝΝΝΝΝΡΝΝΝΝΝΝΝΝΝΝΝ»
                Ί  DOS  ³  UNIX  ³  Windows ³  ANSI C  ³ C++ only  Ί
                ΗΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΔΔΔΆ
  Near version  Ί    ώ  ³    ώ   ³     ώ    ³    ώ     ³           Ί
                ΗΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΔΔΔΆ
  Far version   Ί    ώ  ³        ³     ώ    ³          ³           Ί
                ΘΝΝΝΝΝΝΝΟΝΝΝΝΝΝΝΝΟΝΝΝΝΝΝΝΝΝΝΟΝΝΝΝΝΝΝΝΝΝΟΝΝΝΝΝΝΝΝΝΝΝΌ

  Remarks:
  Copies string src to dest, stopping after the terminating null
  character has been moved.

  Return value:
  strcpy returns dest.

  See also: stpcpy

  Example:
  #include <stdio.h>
  #include <string.h>

  int main(void)
  {
     char string[10];
     char *str1 = "abcdefghi";
     strcpy(string, str1);
     printf("%s\n", string);
     return 0;
  }

  ------------------------------------------------------------------
  Function: _dos_open
  Opens the specified file and prepares it for reading or writing.

  Syntax:
  #include <fcntl.h>
  #include <share.h>
  #include <DOS.H>
  unsigned _dos_open(const char *filename, unsigned oflags, int *handlep);

  Arguments:
  filename --  File that the function opens and prepares for reading and/or
               writing
  oflags   --  Open-mode symbolic constants (defined in FCNTL.H) and
               file-sharing symbolic constants (defined in SHARE.H) that
               specify the file's open mode (read, write, share, etc.)
  handlep  --  Points to the location where the function stores
               the file's handle.

                ΙΝΝΝΝΝΝΝΡΝΝΝΝΝΝΝΝΡΝΝΝΝΝΝΝΝΝΝΡΝΝΝΝΝΝΝΝΝΝΡΝΝΝΝΝΝΝΝΝΝΝ»
                Ί  DOS  ³  UNIX  ³  Windows ³  ANSI C  ³ C++ only  Ί
                ΗΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΔΔΕΔΔΔΔΔΔΔΔΔΔΔΆ
                Ί  Yes  ³        ³    Yes   ³          ³           Ί
                ΘΝΝΝΝΝΝΝΟΝΝΝΝΝΝΝΝΟΝΝΝΝΝΝΝΝΝΝΟΝΝΝΝΝΝΝΝΝΝΟΝΝΝΝΝΝΝΝΝΝΝΌ


  Remarks:
  Opens the file specified by filename, then prepares it for reading
  or writing. The file is always opened in binary mode.

  On successfully opening the file, the function sets the file
  pointer (which marks the current position in the file) to the
  beginning of the file.

  The maximum number of simultaneously open files is defined by
  HANDLE_MAX.

  Return Value:
  On success, _dos_open returns 0, stores the file handle at the location
    *handlep
  On error, _dos_open returns the DOS error code and sets errno to one
    of the following:
           ENOENT  (Path or file not found)
           EMFILE  (Too many open files)
           EACCES  (Permission denied)
           EINVACC (Invalid access code)

   See Also:  _dos_creat _dos_read _dos_write _read open sopen



Turbo Assembler User's Guide
============================
 Appendix D, "Utilities"
 -----------------------
  Page 333
  --------
   The last paragraph states that Turbo Assembler's online Help
   facility is called TASMHELP. TASMHELP can be used as documented,
   but only if Turbo Assembler is installed in a directory other
   than the directory where Borland C++ is installed. If TASM is
   installed in the same directory as Borland C++, use the THELP
   utility for online help. THELP allows you to access a variety
   of help files via an easy to use menu system.

 Here's how THELP works:

  1) After installing Borland C++ and Turbo Assembler, invoke THELP at
     your DOS prompt.

  2) Type ALT-F to bring up the menu of available help files.

  3) Choose TASM.TAH to access help for Turbo Assembler.
